# 第六堂课 创建加载背景图片的类
import pygame  # 导入pygame模块
import sys  # 导入sys模块


class RunMap(pygame.sprite.Sprite):  # 创建滚动地图类

    def __init__(self, map_x, map_y):  # 初始化地图的坐标和图片参数
        self.x = map_x  # 定义map_x为类的x轴坐标
        self.y = map_y  # 定义map_y为类的y轴坐标
        self.image = pygame.image.load("image/bg1.png")  # 读取地图图片到类的image变量中

    def map_rolling(self):  # 定义地图滚动函数
        if self.x <= -1000:  # 如果地图的x坐标小于-1000
            self.x = 1000  # 地图的x坐标更新为1000
        else:  # 否则
            self.x -= 5  # 每次循环地图向左移动5像素

    def map_update(self):  # 定义更新地图函数
        screen.blit(self.image, (self.x, self.y))  # 将地图的图片和坐标位置更新到屏幕上


pygame.init()  # 游戏初始化
screen = pygame.display.set_mode((640, 480))  # 设置游戏窗口大小
pygame.display.set_caption("Eason快跑")  # 设置游戏窗口标题
background = pygame.image.load("image/bg_sky.png")  # 读取游戏的背景到background变量中

# eason的相关内容
image = pygame.image.load("image/eason.png")  # 读取Eason图片到变量image中
eason_x = 320  # 设置eason的x坐标为320
eason_y = 400  # 设置eason的y坐标为400
frame_number = 4  # 帧数
image_number = 0  # 图片的计数变量
fcc_clock = pygame.time.Clock()  # 获取pygame的时钟
frame_rect = image.get_rect()  # 获取全图的矩形数据，以此计算单帧图形
frame_rect.width /= frame_number  # 获取每一帧的边框宽度数据，实例图片之只有一行，所以单帧高度和整体图片高度相等
fps = 30  # 设置刷新率，数字越大刷新率越高，但因为示例图片只有4帧所以建议设低一点 否则闪的太凶。

# 创建地图对象
bg1 = RunMap(0, 0)  # 创建一个地图1的变量继承RunMap类，坐标为0,0
bg2 = RunMap(1024, 0)  # 创建一个地图2的变量继承RunMap类，坐标为1024,0

while True:  # 进入游戏主循环
    for event in pygame.event.get():  # 键盘监听
        if event.type == pygame.QUIT:  # 如果监听到键盘的动作等于pygame的退出
            sys.exit()  # 退出游戏窗口

        if event.type == pygame.KEYDOWN:  # 如果监听到键盘按下如下按键
            if event.key == pygame.K_LEFT:  # 如果按键值等于pygame的向左按键，也就是键盘的向左键
                eason_x -= 10  # eason的坐标往左移10像素
            elif event.key == pygame.K_RIGHT:  # 如果按键值等于pygame的向右按键，也就是键盘的向右键
                eason_x += 10  # eason的坐标往右移10像素
            elif event.key == pygame.K_UP:  # 如果按键值等于pygame的向上按键，也就是键盘的向上键
                eason_y -= 10  # eason的坐标往上移10像素
            elif event.key == pygame.K_DOWN:  # 如果按键值等于pygame的向下按键，也就是键盘的向下键
                eason_y += 10  # eason的坐标往下移10像素

    if image_number < frame_number:  # 如果图片计数变量小于帧数
        frame_rect.x = frame_rect.width * image_number  # 单个图片的坐标等于单个图片宽度乘以图片计数变量
        image_number += 1  # 图片计数变量加1
    else:  # 否则
        image_number = 0  # 图片的计数变量归0

    screen.blit(background, (0, 0))
    # 绘制一个有太阳的背景图片，或者绘制白色图片，否则滚动地图有虚影，而且这行代码要在bg1和bg2之前运行，否则会被覆盖

    bg1.map_update()  # 更新地图1
    bg2.map_update()  # 更新地图2
    bg1.map_rolling()  # 滚动地图1
    bg2.map_rolling()  # 滚动地图2

    screen.blit(image, (eason_x, eason_y), frame_rect)  # 在游戏窗口中绘制单个图片到指定位置上
    fcc_clock.tick(fps)  # 设置游戏窗口刷新率为fps的值
    pygame.display.flip()  # 绘制窗口
